package com.kudostar.android.kudostar;

import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import android.app.ListActivity;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.View;
import android.widget.ListView;

public class AndroidFileBrowser extends ListActivity {
     
     private enum DISPLAYMODE{ ABSOLUTE, RELATIVE; }

     private File currentDirectory = new File("/system/media/");
     private List<IconifiedText> directoryEntries = new ArrayList<IconifiedText>();
     private final DISPLAYMODE displayMode = DISPLAYMODE.RELATIVE;

     private void browseTo(final File aDirectory){
          // On relative we display the full path in the title.
          if(this.displayMode == DISPLAYMODE.RELATIVE)
               this.setTitle(aDirectory.getAbsolutePath() + " :: " + getString(R.string.app_name));
          if (aDirectory.isDirectory()){
               this.currentDirectory = aDirectory;
               fill(aDirectory.listFiles());
          }else{
               setResult( RESULT_OK, aDirectory.getAbsolutePath( ) );
               finish();
          }
     }
     
     /**
      * This function browses to the
      * root-directory of the file-system.
      */
     private void browseToRoot() {
          browseTo(new File("/system/media/"));
    }
     
     /** Checks whether checkItsEnd ends with
      * one of the Strings from fileEndings */
     private boolean checkEndsWithInStringArray(String checkItsEnd, String[] fileEndings){
          for(String aEnd : fileEndings){
               if(checkItsEnd.endsWith(aEnd))
                    return true;
          }
          return false;
     }
     
     private void fill(File[] files) {
          this.directoryEntries.clear();
          
          // Add the "." == "current directory"
          this.directoryEntries.add(new IconifiedText( getString(R.string.current_dir), getResources().getDrawable(R.drawable.folder)));       
          // and the ".." == 'Up one level'
          if(this.currentDirectory.getParent() != null  )
               this.directoryEntries.add(new IconifiedText( getString(R.string.up_one_level), getResources().getDrawable(R.drawable.uponelevel)));
          
          Drawable currentIcon = null;
          for (File currentFile : files){
               if (currentFile.isDirectory()) {
                    currentIcon = getResources().getDrawable(R.drawable.folder);
               }else{
                    String fileName = currentFile.getName();
                    /* Determine the Icon to be used,
                     * depending on the FileEndings defined in:
                     * res/values/fileendings.xml. */
                    if(checkEndsWithInStringArray(fileName, getResources().getStringArray(R.array.fileEndingImage))){
                         currentIcon = getResources().getDrawable(R.drawable.image);
                    }else if(checkEndsWithInStringArray(fileName, getResources().getStringArray(R.array.fileEndingWebText))){
                         currentIcon = getResources().getDrawable(R.drawable.webtext);
                    }else if(checkEndsWithInStringArray(fileName, getResources().getStringArray(R.array.fileEndingPackage))){
                         currentIcon = getResources().getDrawable(R.drawable.packed);
                    }else if(checkEndsWithInStringArray(fileName, getResources().getStringArray(R.array.fileEndingAudio))){
                         currentIcon = getResources().getDrawable(R.drawable.audio);
                    }else{
                         currentIcon = getResources().getDrawable(R.drawable.text);
                    }                   
               }
               switch (this.displayMode) {
                    case ABSOLUTE:
                         /* On absolute Mode, we show the full path */
                         this.directoryEntries.add(new IconifiedText(currentFile
                                   .getPath(), currentIcon));
                         break;
                    case RELATIVE:
                         /* On relative Mode, we have to cut the
                          * current-path at the beginning */
                         int currentPathStringLenght = this.currentDirectory.
                                                                 getAbsolutePath().length();
                         this.directoryEntries.add(new IconifiedText(
                                   currentFile.getAbsolutePath().
                                   substring(currentPathStringLenght),
                                   currentIcon));

                         break;
               }
          }
          Collections.sort(this.directoryEntries);
          
          IconifiedTextListAdapter itla = new IconifiedTextListAdapter(this);
          itla.setListItems(this.directoryEntries);         
          this.setListAdapter(itla);
     }

     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle icicle) {
          super.onCreate(icicle);
          browseToRoot();
     }

     @Override
     protected void onListItemClick(ListView l, View v, int position, long id) {
          super.onListItemClick(l, v, position, id);
          int selectionRowID = (int) this.getSelectionRowID();
          String selectedFileString = this.directoryEntries.get(selectionRowID).getText();
          if (selectedFileString.equals(getString(R.string.current_dir))) {
               // Refresh
               this.browseTo(this.currentDirectory);
          } else if(selectedFileString.equals(getString(R.string.up_one_level))){
               this.upOneLevel();
          } else {
               File clickedFile = null;
               switch(this.displayMode){
                    case RELATIVE:
                         clickedFile = new File(this.currentDirectory.getAbsolutePath() + this.directoryEntries.get(selectionRowID).getText());
                         break;
                    case ABSOLUTE:
                         clickedFile = new File(this.directoryEntries.get(selectionRowID).getText());
                         break;
               }
               if(clickedFile != null)
                    this.browseTo(clickedFile);
          }
     }
     
     /**
      * This function browses up one level
      * according to the field: currentDirectory
      */
     private void upOneLevel(){
          if(this.currentDirectory.getParent() != null)
               this.browseTo(this.currentDirectory.getParentFile());
     }
}